package com.cwt_taxi_xa.protocol;

import android.content.Context;

import com.cwt_taxi_xa.ActivityACC;
import com.cwt_taxi_xa.MainApplication;
import com.cwt_taxi_xa.constants.MyStatus;
import com.cwt_taxi_xa.db.bll.LocalInfoBiz;
import com.cwt_taxi_xa.util.AppLog;
import com.cwt_taxi_xa.util.ExceptionUtil;

import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelHandler;

import java.io.ByteArrayOutputStream;

public class DispatchCenterClientHandler extends SimpleChannelHandler {

	private static final String TAG = "DispatchCenterClientHandler";
	private static StringBuffer tcp7EBuffer = new StringBuffer();
	private static Context context = MainApplication.getInstance()
			.getApplicationContext();

	/**
	 * 当本地客户机已经成功的与远程主机建立连接（connected）时，连接断开的时候才会触发channelDisconnected事件
	 */
	@Override
	public void channelDisconnected(ChannelHandlerContext ctx,
									ChannelStateEvent e) throws Exception {
		// TODO Auto-generated method stub
		super.channelDisconnected(ctx, e);
		AppLog.savelog("监测多次连平台问题--远程服务器主动断开");
		DispatchCenterUsers.stopComm(3);
		System.out.println("【===========远程服务器主动断开=========】");
		// 向主界面更新连接状态
		MyStatus.center = false;
		MainApplication.topActivity.setStatus(2, false);
	}

	@Override
	public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)
			throws Exception {
		// TODO Auto-generated method stub
		super.channelConnected(ctx, e);
		AppLog.i( "【通讯平台】Client: 连接调度中心成功！");
		AppLog.savelog("监测多次连平台问题--连接调度中心成功！");

		// 向主界面更新连接状态
		MyStatus.center = true;
		MainApplication.topActivity.setStatus(2, true);


		// 设置连接标志为已连接
		DispatchCenterUsers.isConnTimer = true;
		// if(DispatchCenterUsers.connectionMode == 1 ){
		// 关闭连接定时器
		if (DispatchCenterUsers.timerConnecter != null) {
			DispatchCenterUsers.timerConnecter.cancel();
		}
		//MCUUtil.mVehicleInformation.connectSyn905();//通过位置30s定位上传
		try {

			//			MainApplication.handler.postDelayed(new Runnable() {
			//				@Override
			//				public void run() {
			//					// TODO Auto-generated method stub
			//					// 向主界面更新连接状态
			//					if (ActivityMain.getInstance() != null) {
			//						ActivityMain.getInstance().handler.obtainMessage(104,
			//								Constants.STATUS_AU_SUCCESS).sendToTarget();
			//					}
			//				}
			//			}, 1000);

			// 考勤数据补传
			LocalInfoBiz.getInstance().postCheckInfo();
			// 营运数据补传
			LocalInfoBiz.getInstance().postBusinessInfo();
			// GPS数据补传
			LocalInfoBiz.getInstance().postGpsInfos();
			/*// 获取盲区补报数据
			Thread thread = new Thread(new RepostRunnable());
			thread.start();*/

		} catch (Exception e1) {
			e1.printStackTrace();
			AppLog.e(ExceptionUtil.getInfo(e1));
		}
		// }
	}

	/** 最后接收时间 */
	public static long lastReceivedTime = 0;
	/** 断网持续时间 */
	public static long unconnectTime = 0;

	/**
	 * 由一个接收了客户端传送数据的MessageEvent事件调用
	 */
	@Override
	public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
			throws Exception {

		if(!ActivityACC.accon){
			return;
		}

		DispatchCenterUsers.channel = ctx.getChannel();
		if ((e.getMessage() instanceof ChannelBuffer)) {
			ChannelBuffer channelBuffer = (ChannelBuffer) e.getMessage();
			byte[] bytes = channelBuffer.array();
			//			String bytesStr = Tools.parseByte2HexStr(bytes);
			//			if(bytesStr.startsWith("7E8001")){
			//				AppLog.i( "【接收】-通用应答" + bytesStr);
			//			}else{
			//				AppLog.e( "【接收】" + bytesStr);
			//			}
			lastReceivedTime = System.currentTimeMillis();
			unconnectTime = 0;

			// 进行粘包处理
			nb_center(bytes, context);
		}
	}

	/**
	 * 事件处理方法由一个ExceptionEvent异常事件调用，这个异常事件起因于Netty的I/O异常
	 * 或一个处理器实现的内部异常。多数情况下，捕捉到的异常应当被记录下来，并在这个方法中
	 * 关闭这个channel通道。当然处理这种异常情况的方法实现可能因你的实际需求而有所不同，
	 * 例如，在关闭这个连接之前你可能会发送一个包含了错误码的响应消息。
	 */
	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e)
			throws Exception {

		/*
		 * try { System.out.println("===========远程服务器异常断开=========");
		 * AppLog.i("【通讯平台】服务器连接断开..........................");
		 * e.getCause().printStackTrace(); Channel channel = e.getChannel();
		 * channel.close(); DispatchCenterUsers.stopComm(2); } catch (Exception
		 * e1) { AppLog.e(ExceptionUtil.getInfo(e1), e1); e1.printStackTrace();
		 * }
		 */
	}

	/**
	 * 7E进行粘包处理
	 */
	public static ByteArrayOutputStream baos_center = new ByteArrayOutputStream(1024*50);
	public static int pic_data_index_center = 0;
	public synchronized static void nb_center(byte[] data, Context context) {
		try {
			for (int i = 0; i < data.length; i++) {
				if(pic_data_index_center==0&&data[i]!=0x7E){
					continue;
				}
				baos_center.write(data[i]);
				pic_data_index_center++;
				if(data[i]==0x7E&&pic_data_index_center>1){
					Decoder.decoderQH808Data(baos_center.toByteArray(), context);
					baos_center.reset();
					pic_data_index_center = 0;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
//	public static void stick7EPackage(byte[] bytes, Context context) {
//		try {
//
//			String data = Tools.parseByte2HexStr(bytes).toUpperCase();
//
//			String[] dataAry = data.split("7E7E");
//			int num = dataAry.length;
//			if (num > 1) {
//				for (int j = 0; j < num; j++) {
//					if (j == 0) {
//						tcp7EBuffer.append(dataAry[j] + "7E");
//						int tcplen = tcp7EBuffer.toString().length();
//						if (tcplen % 2 == 0) {
//							Decoder.decoderQH808Data(Tools
//									.parseHexStr2Byte(tcp7EBuffer.toString()),
//									context);
//							tcp7EBuffer = new StringBuffer();
//						}
//					} else if (j == (num - 1)) {
//						if (data.endsWith("7E7E")) {
//							tcp7EBuffer.append("7E" + dataAry[j] + "7E");
//							int tcplen = tcp7EBuffer.toString().length();
//							if (tcplen % 2 == 0) {
//								Decoder.decoderQH808Data(Tools
//										.parseHexStr2Byte(tcp7EBuffer
//												.toString()), context);
//								tcp7EBuffer = new StringBuffer();
//							}
//							tcp7EBuffer.append("7E");
//						} else {
//							if (dataAry[j].endsWith("7E")) {
//								tcp7EBuffer.append("7E" + dataAry[j]);
//								int tcplen = tcp7EBuffer.toString().length();
//								if (tcplen % 2 == 0) {
//									Decoder.decoderQH808Data(Tools
//											.parseHexStr2Byte(tcp7EBuffer
//													.toString()), context);
//									tcp7EBuffer = new StringBuffer();
//								}
//							} else {
//								tcp7EBuffer.append("7E" + dataAry[j]);
//							}
//						}
//
//					} else {
//						tcp7EBuffer.append("7E" + dataAry[j] + "7E");
//						int tcplen = tcp7EBuffer.toString().length();
//						if (tcplen % 2 == 0) {
//							Decoder.decoderQH808Data(Tools
//									.parseHexStr2Byte(tcp7EBuffer.toString()),
//									context);
//							tcp7EBuffer = new StringBuffer();
//						}
//					}
//				}
//
//			} else {
//				if (data.endsWith("7E7E")) {
//					tcp7EBuffer.append(dataAry[0] + "7E");
//					int tcplen = tcp7EBuffer.toString().length();
//					if (tcplen % 2 == 0) {
//						Decoder.decoderQH808Data(
//								Tools.parseHexStr2Byte(tcp7EBuffer.toString()),
//								context);
//						tcp7EBuffer = new StringBuffer();
//					}
//					tcp7EBuffer.append("7E");
//				} else {
//					if (data.endsWith("7E")) {
//						tcp7EBuffer.append(dataAry[0]);
//						if (data.startsWith("7E")) {
//							int tcplen = tcp7EBuffer.toString().length();
//							if (tcplen % 2 == 0) {
//								Decoder.decoderQH808Data(Tools
//										.parseHexStr2Byte(tcp7EBuffer
//												.toString()), context);
//								tcp7EBuffer = new StringBuffer();
//							}
//						}
//					} else {
//						tcp7EBuffer.append(dataAry[0]);
//					}
//				}
//
//			}
//		} catch (Exception e) {
//			AppLog.e(ExceptionUtil.getInfo(e));
//			e.printStackTrace();
//		}
//	}

}

class RepostRunnable implements Runnable {
	@Override
	public void run() {
		// TODO Auto-generated method stub
		AppLog.i("数据补传--"+"服务器连接成功");
		//		// 获取盲区补报数据
		//		LocationInfoBiz biz = new LocationInfoBiz(
		//				CarCallApplication.getInstance());
		//		// 获取盲区数据
		//		ArrayList<String> infos = biz.getLocationInfos();
		//		if (infos != null && infos.size() != 0) {
		//			// 盲区补报
		//			biz.repostLocations(infos);
		//			// 清楚盲区数据
		//			biz.clearLocationInfos();
		//			AppLog.i("盲区数据补传--"+"数量：" + infos.size() + " 个");
		//		} else {
		//			AppLog.i("盲区数据补传--"+"数量：0 个");
		//		}
		//
		//		BusinessInfoBiz infoBiz = new BusinessInfoBiz(
		//				CarCallApplication.getInstance());
		//		ArrayList<String> data = infoBiz.getInfos();
		//		if (data != null && data.size() != 0) {
		//			infoBiz.repostInfos(data);
		//			infoBiz.clearInfos();
		//			BusinessProcessSZ.repost = true;
		//			AppLog.i("营运数据补传--"+"数量：" + data.size() + " 个");
		//		} else {
		//			AppLog.i("营运数据补传--"+"数量：0 个");
		//		}
	}
}